﻿using System.Linq;
using System.Reflection;
using Vk.Methods.Users;

namespace Vk.Methods.Groups
{
    /// <summary>
    ///     Опциональные поля группы
    /// </summary>
    public class GroupFields
    {
        /// <summary>
        ///     Все поля
        /// </summary>
        public static string[] GetAllFields()
        {
            var fields = typeof(GroupFields).GetFields(BindingFlags.Static | BindingFlags.NonPublic);
            return fields.Where(x => x.FieldType == typeof(string)).Select(x => (string)x.GetValue(null)).ToArray();
        }

        /// <summary>
        /// Информация о занесении в черный список сообщества (поле возвращается только при запросе информации об одном сообществе).
        /// </summary>
        /// <remarks>Поле возвращается только при передаче access_token в запросе.</remarks>
        public const string BanInfo = "ban_info";

        /// <summary>
        ///     Идентификатор города, указанного в информации о сообществе. Если город не указан, возвращается 0.
        /// </summary>
        public const string City = "city";

        /// <summary>
        ///     Идентификатор страны, указанной в информации о сообществе. Если страна не указана, возвращается 0.
        /// </summary>
        public const string Country = "country";

        /// <summary>
        ///     Место, указанное в информации о сообществе.
        /// </summary>
        public const string Place = "place";

        /// <summary>
        ///     Текст описания сообщества.
        /// </summary>
        public const string Description = "description";

        /// <summary>
        ///     Название главной вики-страницы сообщества.
        /// </summary>
        public const string WikiPage = "wiki_page";

        /// <summary>
        ///     Количество участников сообщества.
        /// </summary>
        public const string MembersCount = "members_count";

        /// <summary>
        ///     Возвращается объект counters, содержащий счётчики сообщества
        /// </summary>
        /// <remarks>Поле возвращается только при запросе данных об одном сообществе.</remarks>
        public const string Counters = "counters";

        /// <summary>
        ///     Время начала встречи, для публичной страницы - дата основания
        /// </summary>
        public const string StartDate = "start_date";

        /// <summary>
        ///     Время окончания встречи, для публичной страницы - не возвращается
        /// </summary>
        public const string FinishDate = "finish_date";

        /// <summary>
        ///     Информация о том, может ли текущий пользователь оставлять записи на стене сообщества.
        /// </summary>
        public const string CanPost = "can_post";

        /// <summary>
        ///     Строка состояния публичной страницы. У групп возвращается строковое значение, открыта ли группа или нет, а у
        ///     событий дата начала.
        /// </summary>
        public const string Activity = "activity";

        /// <summary>
        ///     Информация о том, разрешено видеть чужие записи на стене группы.
        /// </summary>
        public const string CanSeeAllPosts = "can_see_all_posts";

        /// <summary>
        ///     Информация о том, может ли текущий пользователь создать тему обсуждения в группе, используя метод board.addTopic.
        /// </summary>
        public const string CanCreateTopic = "can_create_topic";

        /// <summary>
        ///     Статус сообщества. Возвращается строка, содержащая текст статуса, расположенного на странице сообщества под его
        ///     названием.
        /// </summary>
        public const string Status = "status";

        /// <summary>
        ///     Информация из блока контактов публичной страницы.
        /// </summary>
        public const string Contacts = "contacts";

        /// <summary>
        ///     Информация из блока ссылок сообщества.
        /// </summary>
        public const string Links = "links";

        /// <summary>
        ///     Идентификатор post_id закрепленного поста сообщества. Сам пост можно получить, используя wall.getById, передав в
        ///     поле posts – {group_id}_{post_id}.
        /// </summary>
        public const string FixedPost = "fixed_post";

        /// <summary>
        ///     Возвращает информацию о том, является ли сообщество верифицированным.
        /// </summary>
        public const string Verified = "verified";

        /// <summary>
        ///     Адрес сайта из поля «веб-сайт» в описании сообщества.
        /// </summary>
        public const string Site = "site";

        /// <summary>
        ///     Информация о том, может ли текущий пользователь загружать документы в группу.
        /// </summary>
        public const string CanUploadDoc = "can_upload_doc";

        /// <summary>
        /// Статус участника текущего пользователя в сообществе.
        /// </summary>
        public const string MemberStatus = "member_status";

        /// <summary>
        /// Текст описания для поля start_date. Возвращается для публичных страниц.
        /// </summary>
        public const string PublicDateLabel = "public_date_label";

        /// <summary>
        /// Информация о том, может ли текущий пользователь написать личное сообщение сообществу.
        /// </summary>
        public const string CanMessage = "can_message";

        /// <summary>
        /// Информация о том, может ли текущий пользователь загружать видеозаписи в группу. 
        /// </summary>
        public const string CanUploadVideo = "can_upload_video";

        /// <summary>
        /// Идентификатор основного фотоальбома сообщества.
        /// </summary>
        public const string MainAlbumId = "main_album_id";

        /// <summary>
        /// Информация о том, находится ли сообщество в закладках у текущего пользователя.
        /// </summary>
        public const string IsFavorite = "is_favorite";

        /// <summary>
        /// Информация о том, скрыто ли сообщество из ленты новостей текущего пользователя.
        /// </summary>
        public const string IsHiddenFromFeed = "is_hidden_from_feed";

        /// <summary>
        /// Информация о главной секции в сообществе.
        /// </summary>
        public const string MainSection = "main_section";

        /// <summary>
        /// Возрастное ограничение.
        /// </summary>
        public const string AgeLimits = "age_limits";
    }
}